package thread;


/**
 * 多线程练习
 */
public class ThreadExercise02 {

    public static void main(String[] args) {

        /*
            1)有2个用户分别从同一个卡上取钱(总额:10000)
            2)每次都取1000，当余额不足时，就不能取款了
            3)不能出现超取现象 => 线程同步问题
         */

        ATM a = new ATM();
        Thread t1 = new Thread(a);
        Thread t2 = new Thread(a);

        t1.start();
        t2.start();
    }
}

class ATM implements Runnable {

    private static double money = 10000.0;

//    private boolean loop = true;

//    public synchronized void getMoney() {
//
//        if (money <= 0) {
//            System.out.println("取钱结束...");
//            loop = false;
//            return;
//        }
//
//        //休眠50ms，模拟atm缓冲
//        try {
//            Thread.sleep(50);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        money -= 1000.0;
//        System.out.println(Thread.currentThread().getName() + "在取钱，余额= " + money);
//    }


    @Override
    public void run() {

        while(true) {
            synchronized (this) {
                if (money <= 0) {
                    System.out.println("取钱结束...");
//                    loop = false;
                    break;
                }
                money -= 1000.0;
                System.out.println(Thread.currentThread().getName() + "在取钱，余额= " + money);
            }

            //休眠50ms，模拟atm缓冲
            /*
                注意sleep不能放在 synchronized代码块或方法中，因为sleep不会释放锁，会导致只有一个线程在执行
             */
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}